'''
Created on 09/10/2012

@author: rcasal
'''
from repositories.i_repository import IRepository
from gluon.validators import IS_IN_DB
from domain.entities.afiliado import Afiliado, Plan
from gluon.dal import Field


SEXOS = {
    '1' : 'Masculino',
    '0' : 'Femenino'
}

NACIONALIDAD = {
    '1' : 'Argentino',
    '0' : 'Extranjero'
}

class AfiliadoRepository(IRepository):
    '''
    classdocs
    '''

    def __init__(self, afiliaciones, datoscomunes, T):
        '''
        Constructor
        '''
        self.__afiliaciones= afiliaciones
        self.__datoscomunes = datoscomunes
        self.__table = None
        self.__T = T
        
    def define_table(self, migrate = False):
        
        self.__afiliaciones.define_table('Afiliados'
        ,Field('Apellido', type = 'string', length = 50, required = True)
        ,Field('Nombres', type = 'string', length = 50, required = True)
        ,Field('DocumentoTipo', type = 'integer', length = 1, required = True)
        ,Field('DocumentoNro', type = 'integer', length = 4, required = True)
        ,Field('FechaNacimiento', type = 'datetime', length = 8, required = True)
        ,Field('FechaAfiliacion', type = 'datetime', length = 8, required = True)
        ,Field('FechaFallecimiento', type = 'datetime', length = 8, required = True)
        ,Field('Sexo', type = 'integer', length = 1, required = True)
        ,Field('EstadoCivil', type = 'integer', length = 1, required = True)
        ,Field('Nacionalidad', type = 'integer', length = 1, required = True)
        ,Field('CUIL', type = 'string', length = 11, required = True)
        ,Field('Email', type = 'string', length = 100, required = True)
        ,migrate = migrate
        )
    
        self.__table = self.__afiliaciones['Afiliados']
        self.add_requires()
        self.add_represents()
        
    def add_requires(self):
        self.__table.DocumentoTipo.requires = IS_IN_DB(self.__datoscomunes, 'CodTipoDocumento.id', '%(Codigo)s', orderby = 'CodTipoDocumento.descripcion ASC', zero = self.__T('choose one')) 
        self.__table.EstadoCivil.requires = IS_IN_DB(self.__datoscomunes, 'CodEstadoCivil.id','%(Descripcion)s', orderby = 'CodEstadoCivil.descripcion ASC', zero = self.__T('choose one'))

    def add_represents(self):
        self.__table.Sexo.represent = lambda ident: SEXOS[str(ident)] if ident >= 0 else ""
        self.__table.Nacionalidad.represent = lambda ident: NACIONALIDAD[str(ident)] if ident > 0 else "sin datos"
        self.__table.DocumentoTipo.represent = lambda ident: self.__datoscomunes(self.__datoscomunes.CodTipoDocumento.id == ident).select(self.__datoscomunes.CodTipoDocumento.id, self.__datoscomunes.CodTipoDocumento.Descripcion)[0].Descripcion if ident != None else "sin datos"
        self.__table.EstadoCivil.represent = lambda ident: self.__datoscomunes(self.__datoscomunes.CodEstadoCivil.id == ident).select(self.__datoscomunes.CodEstadoCivil.id, self.__datoscomunes.CodEstadoCivil.Descripcion)[0].Descripcion if ident != None else "sin datos"
        self.__table.Email.represent = lambda ident: ident if ident != None else "sin datos"
        self.__table.FechaFallecimiento.represent = lambda ident: ident if ident != None else "------"

    def save(self, entity):
        pass
    
    def delete(self, entity):
        pass
         
    def findAll(self):
        afiliados = self.__afiliaciones(self.__afiliaciones.Afiliados.id > 0).select()
        newafiliados = []
        for af in afiliados:
            afiliado = self.findByCuil(af.CUIL)
            newafiliados.append(afiliado)
        return newafiliados
    
    def findOne(self, idAfil):
        af =  self.__afiliaciones(self.__afiliaciones.Afiliados.id == idAfil).select().last() 
        if af:
            afiliado = self.findByCuil(af.CUIL)
            return afiliado
        else:
            return None  
    
    def findByTipoDocAndNroDoc(self, tipo, nro):
        afiliados = self.__afiliaciones((self.__afiliaciones.Afiliados.DocumentoNro == nro) & (self.__afiliaciones.Afiliados.DocumentoTipo == tipo)).select()
        newafiliados = []
        for af in afiliados:
            newafiliados.append(self.findByCuil(af.CUIL))
        return newafiliados
    
    def findByCuil(self, cuil):
        afiliados = self.__afiliaciones(self.__afiliaciones.Afiliados.CUIL == cuil).select()
        if len(afiliados) == 0:
            return None
        if len(afiliados) > 1:
            raise Exception("mas de un afiliado con el mismo cuil " + str(cuil))
        
        newafiliado = Afiliado.deserialize(afiliados.last())
        #Completo con el plan
        sql = "exec AFIL_Baja " + str(newafiliado.cuil)
        res = self.__afiliaciones.executesql(sql)[0]
        plan = Plan(res.NombrePlan)
        plan.set_baja(res.FechaBaja, res.Observaciones)
        
        newafiliado.plan = plan
        
        return newafiliado
    
    def findRefreshAfiliadoWith(self, afiliado):
        sql = "exec AFIL_Baja " + str(afiliado.cuil)
        ex = self.__afiliaciones.executesql(sql)
        return ex[0]

    
